package category

import (
	"context"
	"encoding/json"
	"github.com/iancoleman/strcase"
	"goods_bff/api"
	"goods_bff/forms"
	"goods_bff/global"
	goods_pb "goods_bff/goodsPb"
	"net/http"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

//我们bff层需要遵循restful风格
//路由尽量不要出现动词,出现的是名词
// get（获取数据） post（添加数据） put（修改数据） delete（删除数据）
// httpcode(http状态码) code（自定义错误码） message（提示消息） data（返回数据） 接口返回数据三要素

func CreateCategory(c *gin.Context) {
	//接收参数
	var form forms.CreateCategoryForm
	//校验参数,因为我们gin自带的验证器不好用，所以我们需要自定义封装验证器，符合国人的简洁中文提示
	if err := c.ShouldBind(&form); err != nil {
		api.ReturnErrorJson(err, c)
		return
	}

	category, err := global.SrvConn.CreateCategory(context.Background(), &goods_pb.CategoryInfoRequest{
		Name:           form.Name,
		ParentCategory: int32(form.ParentCategory),
		Level:          int32(form.Level),
		IsTab:          form.IsTab,
	})
	if err != nil {
		api.HandleGrpcErrorToHttp(err, c)
		return
	}

	//返回响应
	c.JSON(http.StatusOK, gin.H{
		"code": 0,
		"msg":  "创建分类成功",
		"data": category,
	})
}

func CategoryList(c *gin.Context) {

	categoryList, err := global.SrvConn.GetAllCategoryList(context.Background(), &goods_pb.Empty{})
	if err != nil {
		api.HandleGrpcErrorToHttp(err, c)
		return
	}
	//
	//var category []*model.Category
	//
	//json.Unmarshal([]byte(categoryList.JsonData), &category)

	category := make([]interface{}, 0)

	err = json.Unmarshal([]byte(categoryList.JsonData), &category)
	if err != nil {
		zap.S().Errorw("[List] 查询 【分类列表】失败： ", err.Error())
	}

	// Convert keys to snake_case
	snakeCaseCategory := convertMapKeysToSnakeCase(category)

	c.JSON(http.StatusOK, gin.H{
		"code": 0,
		"msg":  "success",
		"data": snakeCaseCategory,
	})
}

func UpdateCategory(c *gin.Context) {

	//接收参数
	var form forms.UpdateCategoryForm
	//校验参数,因为我们gin自带的验证器不好用，所以我们需要自定义封装验证器，符合国人的简洁中文提示
	if err := c.ShouldBind(&form); err != nil {
		api.ReturnErrorJson(err, c)
		return
	}

	category, err := global.SrvConn.UpdateCategory(context.Background(), &goods_pb.CategoryInfoRequest{
		Id:             int32(form.ID),
		Name:           form.Name,
		ParentCategory: int32(form.ParentCategory),
		Level:          int32(form.Level),
		IsTab:          form.IsTab,
	})

	if err != nil {
		api.HandleGrpcErrorToHttp(err, c)
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"code": 0,
		"msg":  "success",
		"data": category,
	})
}

func DeleteCategory(c *gin.Context) {

	//接收参数
	var form forms.DeleteCategoryForm
	//校验参数,因为我们gin自带的验证器不好用，所以我们需要自定义封装验证器，符合国人的简洁中文提示
	if err := c.ShouldBind(&form); err != nil {
		api.ReturnErrorJson(err, c)
		return
	}

	global.SrvConn.DeleteCategory(context.Background(), &goods_pb.DeleteCategoryRequest{
		Id: int32(form.ID),
	})

	c.JSON(http.StatusOK, gin.H{
		"code": 0,
		"msg":  "success",
		"data": nil,
	})
}

func convertMapKeysToSnakeCase(data interface{}) interface{} {
	switch val := data.(type) {
	case map[string]interface{}:
		newMap := make(map[string]interface{})
		for k, v := range val {
			newMap[strcase.ToSnake(k)] = convertMapKeysToSnakeCase(v)
		}
		return newMap
	case []interface{}:
		for i, v := range val {
			val[i] = convertMapKeysToSnakeCase(v)
		}
		return val
	default:
		return data
	}
}
